#include "spi.h"

#define BSP_USING_SPI4
#define SPI4_SCK_E11_MISO_E13_MOSI_E14

#ifdef BSP_USING_SPI1
static void spi1_msp_init(void)
{
#if defined(SPI1_SCK_A5_MISO_A6_MOSI_A7)
    GPIO_InitType GPIO_InitStruct;
    /* enable GPIO clock */
    RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOA,ENABLE);
    /* connect port to SPI1_SCK */
    GPIO_InitStruct.GPIO_Pins = GPIO_Pins_5;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStruct.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;    
    GPIO_Init(GPIOA,&GPIO_InitStruct);
    /* connect port to SPI1_MISO */
    GPIO_InitStruct.GPIO_Pins = GPIO_Pins_6;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_PU;
    GPIO_InitStruct.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;    
    GPIO_Init(GPIOA,&GPIO_InitStruct);
    /* connect port to SPI1_SCK */
    GPIO_InitStruct.GPIO_Pins = GPIO_Pins_7;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStruct.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;    
    GPIO_Init(GPIOA,&GPIO_InitStruct);    
#elif defined(SPI1_SCK_B3_MISO_B4_MOSI_B5)
    GPIO_InitType GPIO_InitStruct;
    /* enable GPIO clock */
    RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOB | RCC_APB2PERIPH_AFIO,ENABLE);
    /* SPI1 remap enable */
    GPIO_PinsRemapConfig(GPIO_Remap01_SPI1,ENABLE);     
    /* connect port to SPI1_SCK */
    GPIO_InitStruct.GPIO_Pins = GPIO_Pins_3;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStruct.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;    
    GPIO_Init(GPIOB,&GPIO_InitStruct);
    /* connect port to SPI1_MISO */
    GPIO_InitStruct.GPIO_Pins = GPIO_Pins_4;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_PU;
    GPIO_InitStruct.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;    
    GPIO_Init(GPIOB,&GPIO_InitStruct);
    /* connect port to SPI1_SCK */
    GPIO_InitStruct.GPIO_Pins = GPIO_Pins_5;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStruct.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;    
    GPIO_Init(GPIOB,&GPIO_InitStruct);  
#elif defined(SPI1_SCK_A5_MISO_G0_MOSI_G1)
    GPIO_InitType GPIO_InitStruct;
    /* enable GPIO clock */
    RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOA | RCC_APB2PERIPH_GPIOG | RCC_APB2PERIPH_AFIO,ENABLE);
    /* SPI1 remap enable */
    GPIO_PinsRemapConfig(GPIO_Remap10_SPI1,ENABLE);      
    /* connect port to SPI1_SCK */
    GPIO_InitStruct.GPIO_Pins = GPIO_Pins_5;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStruct.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;    
    GPIO_Init(GPIOA,&GPIO_InitStruct);
    /* connect port to SPI1_MISO */
    GPIO_InitStruct.GPIO_Pins = GPIO_Pins_0;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_PU;
    GPIO_InitStruct.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;    
    GPIO_Init(GPIOG,&GPIO_InitStruct);
    /* connect port to SPI1_SCK */
    GPIO_InitStruct.GPIO_Pins = GPIO_Pins_1;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStruct.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;    
    GPIO_Init(GPIOG,&GPIO_InitStruct);  
#endif
}
#endif /* BSP_USING_SPI1 */

#ifdef BSP_USING_SPI2
static void spi2_msp_init(void)
{
#if defined(SPI2_SCK_B13_MISO_B14_MOSI_B15)
    GPIO_InitType GPIO_InitStruct;
    /* enable GPIO clock */
    RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOB,ENABLE);
    /* connect port to SPI2_SCK */
    GPIO_InitStruct.GPIO_Pins = GPIO_Pins_13;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStruct.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;    
    GPIO_Init(GPIOB,&GPIO_InitStruct);
    /* connect port to SPI2_MISO */
    GPIO_InitStruct.GPIO_Pins = GPIO_Pins_14;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_PU;
    GPIO_InitStruct.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;    
    GPIO_Init(GPIOB,&GPIO_InitStruct);
    /* connect port to SPI2_SCK */
    GPIO_InitStruct.GPIO_Pins = GPIO_Pins_15;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStruct.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;    
    GPIO_Init(GPIOB,&GPIO_InitStruct); 
#endif
}
#endif /* BSP_USING_SPI2 */

#ifdef BSP_USING_SPI3
static void spi3_msp_init(void)
{
#if defined(SPI3_SCK_B3_MISO_B4_MOSI_B5)
    GPIO_InitType GPIO_InitStruct;
    /* enable GPIO clock */
    RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOB,ENABLE);
    /* connect port to SPI3_SCK */
    GPIO_InitStruct.GPIO_Pins = GPIO_Pins_3;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStruct.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;    
    GPIO_Init(GPIOB,&GPIO_InitStruct);
    /* connect port to SPI3_MISO */
    GPIO_InitStruct.GPIO_Pins = GPIO_Pins_4;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_PU;
    GPIO_InitStruct.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;    
    GPIO_Init(GPIOB,&GPIO_InitStruct);
    /* connect port to SPI3_SCK */
    GPIO_InitStruct.GPIO_Pins = GPIO_Pins_5;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStruct.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;    
    GPIO_Init(GPIOB,&GPIO_InitStruct); 
#endif
}
#endif /* BSP_USING_SPI3 */

#ifdef BSP_USING_SPI4
static void spi4_msp_init(void)
{
#if defined(SPI4_SCK_E2_MISO_E5_MOSI_E6)
    GPIO_InitType GPIO_InitStruct;
    /* enable GPIO clock */
    RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOE,ENABLE);
    /* connect port to SPI4_SCK */
    GPIO_InitStruct.GPIO_Pins = GPIO_Pins_2;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStruct.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;    
    GPIO_Init(GPIOE,&GPIO_InitStruct);
    /* connect port to SPI4_MISO */
    GPIO_InitStruct.GPIO_Pins = GPIO_Pins_5;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_PU;
    GPIO_InitStruct.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;    
    GPIO_Init(GPIOE,&GPIO_InitStruct);
    /* connect port to SPI4_SCK */
    GPIO_InitStruct.GPIO_Pins = GPIO_Pins_6;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStruct.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;    
    GPIO_Init(GPIOE,&GPIO_InitStruct); 
#elif defined(SPI4_SCK_E11_MISO_E13_MOSI_E14)
    GPIO_InitType GPIO_InitStruct;
    /* enable GPIO clock */
    RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOE | RCC_APB2PERIPH_AFIO,ENABLE);
    /* SPI4 remap enable */
    GPIO_PinsRemapConfig(GPIO_Remap_SPI4,ENABLE);
    /* connect port to SPI4_SCK */
    GPIO_InitStruct.GPIO_Pins = GPIO_Pins_11;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStruct.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;    
    GPIO_Init(GPIOE,&GPIO_InitStruct);
    /* connect port to SPI4_MISO */
    GPIO_InitStruct.GPIO_Pins = GPIO_Pins_13;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_PU;
    GPIO_InitStruct.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;    
    GPIO_Init(GPIOE,&GPIO_InitStruct);
    /* connect port to SPI4_SCK */
    GPIO_InitStruct.GPIO_Pins = GPIO_Pins_14;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStruct.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;    
    GPIO_Init(GPIOE,&GPIO_InitStruct); 
#endif
}
#endif /* BSP_USING_SPI4 */

int spi_msp_init(SPI_Type *SPIx)
{
    switch((uint32_t)SPIx)
    {
#ifdef BSP_USING_SPI1        
        case SPI1_BASE:
            spi1_msp_init();
            RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_SPI1,ENABLE);
            break;
#endif

#ifdef BSP_USING_SPI2        
        case SPI2_BASE:
            spi2_msp_init();
            RCC_APB1PeriphClockCmd(RCC_APB1PERIPH_SPI2,ENABLE);
            break;
#endif
        
#ifdef BSP_USING_SPI3        
        case SPI3_BASE:
            spi3_msp_init();
            RCC_APB1PeriphClockCmd(RCC_APB1PERIPH_SPI3,ENABLE);
            break;
#endif
        
#ifdef BSP_USING_SPI4        
        case SPI4_BASE:
            spi4_msp_init();
            RCC_APB1PeriphClockCmd(RCC_APB1PERIPH_SPI4,ENABLE);
            break;   
#endif        
    }
    
    return RT_EOK;
}
